#!/bin/bash
# 查找给定提交或标签的上一个稳定版本标签（base rc tag）
# 使用Git原生命令直接查找，支持标签和提交hash
# 用法: git-base-rc-tag.sh [-C <dir>] [-v|--verbose] <commit-or-tag>
#       git-base-rc-tag.sh <repo-path> <commit-or-tag>
#
# 参数:
#   -C <dir>        指定Git仓库目录
#   -v, --verbose   启用详细输出模式
#   commit-or-tag   指定提交或标签（默认为HEAD）



# 主函数
find_base_rc_tag() {
    local work_dir="$1"
    local commit="$2"

    if [ "$VERBOSE" = "true" ]; then
        echo "[DEBUG] find_base_rc_tag: 工作目录='$work_dir', 提交='$commit'" >&2
    fi

    # 验证提交/标签是否存在
    if ! git -C "$work_dir" rev-parse "$commit" >/dev/null 2>&1; then
        if [ "$VERBOSE" = "true" ]; then
            echo "[DEBUG] 提交验证失败: '$commit'" >&2
            git -C "$work_dir" rev-parse "$commit" 2>&1 | sed 's/^/[DEBUG] git rev-parse error: /' >&2
        fi
        echo "错误: 无效提交 '$commit'" >&2
        return 1
    else
        if [ "$VERBOSE" = "true" ]; then
            echo "[DEBUG] 提交验证成功: '$commit'" >&2
        fi
    fi

    # 使用Git原生命令直接查找上一个稳定版本标签
    # 使用 ^ 符号表示父提交，匹配 vX.Y 格式的标签（不要带rc的）
    if [ "$VERBOSE" = "true" ]; then
        echo "[DEBUG] 执行: git describe --tags --abbrev=0 --match='v[0-9].[0-9]' '$commit^'" >&2
    fi

    local base_tag=$(git -C "$work_dir" describe --tags --abbrev=0 --match="v[0-9].[0-9]" "$commit^" 2>/dev/null)

    if [ -n "$base_tag" ]; then
        if [ "$VERBOSE" = "true" ]; then
            echo "[DEBUG] 成功找到基础版本标签: '$base_tag'" >&2
        fi
        echo "$base_tag"
        return 0
    else
        if [ "$VERBOSE" = "true" ]; then
            echo "[DEBUG] git describe 未找到匹配的标签" >&2
            echo "[DEBUG] 尝试查找所有vX.Y格式的标签..." >&2
            git -C "$work_dir" tag -l "v[0-9].[0-9]" | head -10 | sed 's/^/[DEBUG] 可用标签: /' >&2
        fi
        echo "错误: 未找到 $commit 的基础版本标签" >&2
        return 1
    fi
}

# 脚本入口
main() {
    local work_dir="."
    local commit="HEAD"
    VERBOSE="false"

    # 解析参数
    while [[ $# -gt 0 ]]; do
        case "$1" in
            -C)
                work_dir="$2"
                shift 2
                ;;
            -v|--verbose)
                VERBOSE="true"
                shift
                ;;
            -*)
                echo "错误: 未知选项 '$1'" >&2
                echo "用法: $0 [-C <dir>] [-v|--verbose] [commit-or-tag]" >&2
                return 1
                ;;
            *)
                # 如果是目录则作为仓库路径，否则作为提交
                if [ -d "$1" ]; then
                    work_dir="$1"
                else
                    commit="$1"
                fi
                shift
                ;;
        esac
    done

    if [ "$VERBOSE" = "true" ]; then
        echo "[DEBUG] 脚本启动参数: 工作目录='$work_dir', 提交='$commit', 详细模式=启用" >&2
    fi

    # 检查目录
    if [ ! -d "$work_dir" ]; then
        echo "错误: 目录不存在 '$work_dir'" >&2
        return 1
    fi

    # 检查是否为Git仓库
    if ! git -C "$work_dir" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
        echo "错误: '$work_dir' 不是Git仓库" >&2
        return 1
    fi

    if [ "$VERBOSE" = "true" ]; then
        echo "[DEBUG] Git仓库验证成功" >&2
        echo "[DEBUG] 仓库根目录: $(git -C "$work_dir" rev-parse --show-toplevel)" >&2
    fi

    # 执行查找
    find_base_rc_tag "$work_dir" "$commit"
}

# 执行
main "$@"
